#include <stdio.h>
#include "unistd.h"
#include "stdlib.h"
#include "sys/types.h"
#include "sys/wait.h"
#include "string.h"
#include "sys/mman.h"
#include "fcntl.h"
#include "mqueue.h"

int main(int argc, char const *argv[])
{

    struct mq_attr attr;
    attr.mq_flags = 0;      // 阻塞式队列
    attr.mq_maxmsg = 10;    // 最大消息数
    attr.mq_msgsize = 1024; // 每个消息的最大长度
    attr.mq_curmsgs = 0;    // 当前消息数
    // 创建一个消息队列
    mqd_t mq = mq_open("/my_mq", O_CREAT | O_RDWR, 0666, &attr);
    if (mq == -1)
    {
        perror("创建消息队列失败");
    }

    int pid = fork();
    if (pid == -1)
    {
        perror("进程fork失败");
    }
    else if (pid > 0)
    {
        char *msg = "hello world";
         if (mq_send(mq, msg, strlen(msg), 0) == -1)
        {
            perror("发送消息失败");
            exit(EXIT_FAILURE);
        } 

        waitpid(pid, NULL, 0);
        mq_close(mq);
        mq_unlink("/my_mq");
    }
    else if (pid == 0)
    {
        char buf[1024];
        memset(buf, 0, sizeof(buf));
        if (mq_receive(mq, buf, sizeof(buf), NULL) == -1)
        {
            perror("接收消息失败");
            exit(EXIT_FAILURE);
        }
        printf("子进程接收到消息：%s\n", buf);
        mq_close(mq);
    }

    return 0;
}
